package com.sandbox;

public class Input {

    private static final boolean[] keys = new boolean[512];
    private static final boolean[] lastKeys = new boolean[512];

    /**
     * 更新按键状态（按下/释放）
     *
     * @param key     按键码
     * @param pressed true=按键按下，false=按键释放
     */
    public static void update(int key, boolean pressed) {
        lastKeys[key] = keys[key]; // 先保存上一帧状态
        keys[key] = pressed;       // 更新当前帧状态
    }

    /**
     * 检测按键是否【持续按下】（当前帧处于按下状态）
     *
     * @param key 目标按键码
     * @return true=持续按下，false=未按下
     */
    public static boolean isKeyPressed(int key) {
        return keys[key];
    }

    /**
     * 检测按键是否【刚刚按下】（仅当前帧按下，上一帧未按下，且仅触发一次）
     *
     * @param key 目标按键码
     * @return true=刚刚按下，false=非刚刚按下
     */
    public static boolean isKeyDown(int key) {
        // 逻辑：当前按下 + 上一帧未按下
        boolean result = keys[key] && !lastKeys[key];
        if (result) {
            // 防重复触发：将上一帧状态置为 true，避免后续帧重复判定为"刚刚按下"
            lastKeys[key] = true;
        }
        return result;
    }

    /**
     * 检测按键是否【刚刚释放】（仅当前帧释放，上一帧按下，且仅触发一次）
     *
     * @param key 目标按键码
     * @return true=刚刚释放，false=非刚刚释放
     */
    public static boolean isKeyUp(int key) {
        // 逻辑：当前释放 + 上一帧按下
        boolean result = !keys[key] && lastKeys[key];
        if (result) {
            // 防重复触发：将上一帧状态置为 false，避免后续帧重复判定为"刚刚释放"
            lastKeys[key] = false;
        }
        return result;
    }
}